# 18-使用Java Config实现Spring Ioc
基于Java Config的优势
- 完全摆脱XML的束缚,使用独立Java类管理对象与依赖
- 注解配置相对分散,利用Java Config可对配置集中管理
- 可以在编译时进行依赖检查,不容易出错
基于Java Config的缺点
- 如果后续需要更改接口实现类,则需要修改源码,重新编译打包发布
# 18-Java Config-对象实例化
Java Config核心注解
注解 | 说明 |
---|---|
@Configuration | 描述类,说明当前类是Java Config配置类,完全替代XML文件 |
@Bean | 描述方法,方法返回对象将被IoC容器管理,beanId默认为方法名 |
@ImportResource | 描述类,加载静态文件,可使用@Value注解获取 |
@ComponentScan | 组件扫描,同XML的<context:compoment-scan>标签 |
# Java Config对象实例化-示例代码
package com.torey.spring.ioc;
import com.torey.spring.ioc.controller.UserController;
import com.torey.spring.ioc.dao.UserDao;
import com.torey.spring.ioc.service.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author http://torey611.gitee.io/li-tao-feng/
* @Email torey6061@qq.com
* @Date 2021/5/1 10:42
* @描述:
*/
@Configuration//当前类是一个配置类,用于替代applicationContext.xml文件
public class Config {
@Bean //Java Config利用方法创建对象,将方法返回对象放入容器,beanId=方法名
public UserDao userDao(){
return new UserDao();
}
@Bean
public UserService userService(){
return new UserService();
}
@Bean
public UserController userController(){
return new UserController();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.torey.spring.ioc;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @Author http://torey611.gitee.io/li-tao-feng/
* @Email torey6061@qq.com
* @Date 2021/5/1 10:51
* @描述:
*/
public class SpringApplication {
public static void main(String[] args) {
//基于Java Config配置IoC容器初始化
AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(Config.class);
String[] definitionNames = context.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
打印输出如下:
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
config
userDao
userService
userController
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# Java Config-对象依赖注入-示例代码
package com.torey.spring.ioc.dao;
/**
* @Author http://torey611.gitee.io/li-tao-feng/
* @Email torey6061@qq.com
* @Date 2021/5/1 10:41
* @描述:
*/
public class UserDao {
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
package com.torey.spring.ioc.dao;
import org.springframework.stereotype.Repository;
/**
* @Author http://torey611.gitee.io/li-tao-feng/
* @Email torey6061@qq.com
* @Date 2021/5/1 11:42
* @描述:
*/
@Repository
public class EmployeeDao {
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.torey.spring.ioc.service;
import com.torey.spring.ioc.dao.EmployeeDao;
import com.torey.spring.ioc.dao.UserDao;
/**
* @Author http://torey611.gitee.io/li-tao-feng/
* @Email torey6061@qq.com
* @Date 2021/5/1 10:42
* @描述:
*/
public class UserService {
private UserDao userDao;
private EmployeeDao employeeDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setEmployeeDao(EmployeeDao employeeDao) {
this.employeeDao = employeeDao;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.torey.spring.ioc.controller;
import com.torey.spring.ioc.service.UserService;
/**
* @Author http://torey611.gitee.io/li-tao-feng/
* @Email torey6061@qq.com
* @Date 2021/5/1 10:41
* @描述:
*/
public class UserController {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.torey.spring.ioc;
import com.torey.spring.ioc.controller.UserController;
import com.torey.spring.ioc.dao.EmployeeDao;
import com.torey.spring.ioc.dao.UserDao;
import com.torey.spring.ioc.service.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
* @Author http://torey611.gitee.io/li-tao-feng/
* @Email torey6061@qq.com
* @Date 2021/5/1 10:42
* @描述: Bean Java Config利用方法创建对象,将方法返回对象放入容器,beanId=方法名
*
*/
@Configuration//当前类是一个配置类,用于替代applicationContext.xml文件
@ComponentScan("com.torey.spring.ioc") //@ComponentScan 会扫描所配置包,如果类上有标注了@Repository,就会被sping ioc容器管理
public class Config {
//先按name尝试注入,name不存在则按类型注入
@Bean//Java Config利用方法创建对象,将方法返回对象放入容器,beanId=方法名
public UserService userService(UserDao userDao ,EmployeeDao employeeDao){
UserService userService = new UserService();
userService.setUserDao(userDao);
userService.setEmployeeDao(employeeDao);
System.out.println(this.getClass().getName() + "userService已创建");
return userService;
}
@Bean
public UserController userController(UserService userService){
UserController userController = new UserController();
userController.setUserService(userService);
System.out.println(this.getClass().getName() + "userController已创建");
return userController;
}
@Bean
public UserDao userDao(){
UserDao userDao = new UserDao();
System.out.println(this.getClass().getName() + "userDao已创建");
return userDao;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.torey.spring.ioc;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @Author http://torey611.gitee.io/li-tao-feng/
* @Email torey6061@qq.com
* @Date 2021/5/1 10:51
* @描述:
*/
public class SpringApplication {
public static void main(String[] args) {
//基于Java Config配置IoC容器初始化
AnnotationConfigApplicationContext context= new AnnotationConfigApplicationContext(Config.class);
String[] definitionNames = context.getBeanDefinitionNames();
for (String name : definitionNames) {
System.out.println(name);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21